package Server;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

/**
 * Classe associée à chaque joueu
 * Il y aura autant d'instances de cette classe que de joueurs connectés
 */
class JoueurThread implements Runnable
{
    private Thread thread; // contiendra le thread du client
    private Socket socket; // recevra le socket liant au client
    private PrintWriter out; // pour gestion du flux de sortie
    private BufferedReader in; // pour gestion du flux d'entrée
    private TarotServer tarotServer; // pour utilisation des méthodes de la classe principale
    private int idClient = 0; // contiendra le numéro de client géré par ce thread

    JoueurThread(Socket s, TarotServer tarotServer) // le param s est donnée dans BlablaServ par ss.accept()
    {
        this.tarotServer =tarotServer; // passage de local en global (pour gestion dans les autres méthodes)
        this.socket =s; // passage de local en global
        try
        {
            // fabrication d'une variable permettant l'utilisation du flux de sortie avec des string
            this.out = new PrintWriter(this.socket.getOutputStream());
            // fabrication d'une variable permettant l'utilisation du flux d'entrée avec des string
            this.in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            // enregistrement du joueur au près de la classe principale
            tarotServer.ajouterJoueur(this);
        }
        catch (IOException e){ }

        this.thread = new Thread(this); // instanciation du thread
        this.thread.start(); // demarrage du thread, la fonction run() est ici lancée
    }

    @Override
    public void run()
    {
        // on indique dans la console la connection d'un nouveau client
        System.out.println("Un nouveau client s'est connecte, no "+this.idClient);
        try
        {
            while(true){
                this.onReceiveMessage(this.in.readLine());
            }
        }
        catch (Exception e){ }
        finally // finally se produira le plus souvent lors de la deconnexion du client
        {
            try
            {
                // on indique à la console la deconnexion du client
                System.out.println("Le client no "+this.idClient +" s'est deconnecte");
                this.tarotServer.supprimerJoueur(this.idClient); // on supprime le client de la liste
                this.socket.close(); // fermeture du socket si il ne l'a pas déjà été (à cause de l'exception levée plus haut)
            }
            catch (IOException e){ }
        }
    }

    private void onReceiveMessage(String message) {
        System.out.println("Client no " + this.idClient + " a envoyé le message : " + message);

    }

    /**
     * Envoye un message au client sur le flux de sortie
     * @param str le message
     */
    synchronized public void send(String str){
        this.out.println(str);
    }

    public int getIdClient() {
        return this.idClient;
    }

    public void setIdClient(int idClient) {
        this.idClient = idClient;
    }
}